package br.com.iniciativabutterfly.avaliacao;

import java.io.BufferedReader;
import java.io.File;
import java.io.FileReader;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;

public class Avaliacao {
	private IdentificacaoLinhaEnum identificacaoLinhaAnterior;

	public static void main(String[] args) throws IOException {
		List<Questao> realizaLeituraArquivo = new Avaliacao()
				.realizaLeituraArquivo();

		System.out.println(realizaLeituraArquivo.size());
	}

	public List<Questao> realizaLeituraArquivo() throws IOException {
		File arquivo = new File("C:\\avaliacaoButterfly\\teste_java.txt");
		FileReader arquivoLeitura = new FileReader(arquivo);

		BufferedReader leitor = new BufferedReader(arquivoLeitura);
		String linha = "";

		List<Questao> questoes = new ArrayList<Questao>();
		Questao q = new Questao();
		int tabNivel = 1;
		boolean linhaAnteriorTemChaveAberta = false;
		boolean linhaAnteriorTemChaveFechada = false;
		while ((linha = leitor.readLine()) != null) {
			if (isNovaQuestao(linha, q)) {
				q.getOpcoes().put("z", "N�o sei a resposta");
				mockaQuestao(q);

				questoes.add(q);
				q = new Questao();
				tabNivel = 1;
				linhaAnteriorTemChaveAberta = false;
				linhaAnteriorTemChaveFechada = false;
				System.out
						.println("#######################################################################################################");
			}

			if (isNumeroQuestao(linha)) {
				q.setNumero(linha.replace("Q", "Quest�o "));
				identificacaoLinhaAnterior = IdentificacaoLinhaEnum.NUMERO;
			} else if (isTituloQuestao(linha)) {
				q.setAceitaVariasRespostas(aceitaVariasRespostas(linha));
				q.setTitulo(linha);
				identificacaoLinhaAnterior = IdentificacaoLinhaEnum.TITULO;
			} else if (isCorpoQuestao(linha)) {
				// if (q.getCorpo() != null) {
				//
				// if (linhaAnteriorTemChaveAberta) {
				// tabNivel++;
				// }
				//
				// if (linha.contains("{") && !linha.contains("{}")) {
				// linhaAnteriorTemChaveAberta = true;
				// linhaAnteriorTemChaveFechada = false;
				// }else if (linha.contains("}") && !linha.contains("{}")) {
				// linhaAnteriorTemChaveFechada = true;
				// linhaAnteriorTemChaveAberta = false;
				// }else{
				// linhaAnteriorTemChaveAberta = false;
				// linhaAnteriorTemChaveFechada = false;
				// }
				//
				// if (linhaAnteriorTemChaveFechada) {
				// tabNivel--;
				// }
				// String linhaNumero = linha.split("\\. ")[0];
				// String linhaCodigo = linha.split("\\. ").length > 1 ?
				// linha.split("\\. ")[1] : "";
				// linha = linhaNumero + ". " +
				// "<span class='tab-nivel-"+tabNivel+"'>"+ linhaCodigo +
				// "</span>";
				// }
				q.setCorpo(linha);
				identificacaoLinhaAnterior = IdentificacaoLinhaEnum.CORPO;
			} else if (isPerguntaQuestao(linha)) {
				q.setAceitaVariasRespostas(aceitaVariasRespostas(linha));
				q.setPergunta(linha);
				identificacaoLinhaAnterior = IdentificacaoLinhaEnum.PERGUNTA;
			} else if (isOpcao(linha)) {
				q.getOpcoes().put(linha.split("\\.")[0], linha.split("\\.")[1]);
				identificacaoLinhaAnterior = IdentificacaoLinhaEnum.PERGUNTA;
			}

			System.out.println(linha);
		}

		return questoes;
	}

	private void mockaQuestao(Questao q) {
		List<String> respostas = new ArrayList<String>();
		respostas.add("a");
		q.setRespostasCorretas(respostas);

		if (q.getNumero().startsWith("Quest�o 1")) {
			q.setAssuntoAvaliado("Listas");
		}
		if (q.getNumero().startsWith("Quest�o 2")) {
			q.setAssuntoAvaliado("Threads");
		}
		if (q.getNumero().startsWith("Quest�o 3")) {
			q.setAssuntoAvaliado("Orienta��o a Objetos");
		}
		if (q.getNumero().startsWith("Quest�o 4")) {
			q.setAssuntoAvaliado("Exceptions");
		}

	}

	private boolean aceitaVariasRespostas(String linha) {
		if (linha.contains("Which of the following statements are")) {
			return true;
		}
		return false;
	}

	/**
	 * @param linha
	 * @param q
	 * @return
	 */
	private boolean isNovaQuestao(String linha, Questao q) {
		return isNumeroQuestao(linha) && q.getTitulo() != null;
	}

	private boolean isNumeroQuestao(String linha) {
		if (linha.startsWith("Q") && linha.length() <= 4
				&& linha.substring(1, 2).matches("[0-9]")) {
			return true;
		}
		return false;
	}

	private boolean isTituloQuestao(String linha) {
		if (this.identificacaoLinhaAnterior == IdentificacaoLinhaEnum.NUMERO
				|| (this.identificacaoLinhaAnterior == IdentificacaoLinhaEnum.TITULO
						&& !isCorpoQuestao(linha) && !isOpcao(linha))) {
			return true;
		}
		return false;
	}

	private boolean isCorpoQuestao(String linha) {
		if ((linha.indexOf(".") == 1 || linha.indexOf(".") == 2)
				&& linha.substring(0, 1).matches("[0-9]")) {
			return true;
		}
		return false;
	}

	private boolean isPerguntaQuestao(String linha) {
		if (!linha.startsWith("a.")
				&& this.identificacaoLinhaAnterior == IdentificacaoLinhaEnum.CORPO
				|| (this.identificacaoLinhaAnterior == IdentificacaoLinhaEnum.PERGUNTA && !isOpcao(linha))) {
			return true;
		}
		return false;
	}

	private boolean isOpcao(String linha) {
		if (linha.indexOf(".") == 1 && linha.substring(0, 1).matches("[a-z]")) {
			return true;
		}
		return false;
	}
}
